home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
KEYWITCH
/
KW_S200.LZH
/
w10head.s
< prev
next >
Wrap
Text File
|
1995-03-20
|
8KB
|
372 lines
.include w02iocs.mac
.include w03const.mac
.include w04macro.mac
.include w05reloc.mac
.include w08id.mac
.text
.even
********************************
*相対アドレッシングのためのベースアドレス
base:: equ prog_head+$7F00 *ワークエリアの最後まで届くようにずらす
********************************
*プログラムはじめ
prog_head::
*デバイスヘッダ
.dc.l -1
.dc.w $8000
.dc.l device_strategy
.dc.l device_interrupt
device_name::
.dc.b '"Witch?"'
device_request::
.ds.l 1
device_strategy::
move.l a5,device_request
rts
device_interrupt::
move.l a5,-(sp)
move.l d0,-(sp)
move.w #$5003,d0
movea.l device_request(pc),a5
tst.b 2(a5)
bne device_error *初期化以外のデバイスコマンドは無効
bsr device_main *メインルーチンを呼ぶ
device_error::
move.b d0,3(a5)
ror.w #8,d0
move.b d0,4(a5)
move.l (sp)+,d0
movea.l (sp)+,a5
rts
********************************
*デバイスドライバの末尾のアドレス
device_end::
.dc.l 0
********************************
*データ部を別にアロケートした場合のアドレス
alloc_point::
.dc.l 0
********************************
*ベクタ管理テーブル
vector_table::
*キー入力エラー割り込み
.dc.w KEYERR*4
.ds.l 1
.dc.l key_err
*キー入力割り込み
.dc.w KEYINT*4
.ds.l 1
.dc.l key_int
*B_KEYINP
.dc.w $0400+_B_KEYINP*4
old_b_keyinp::
.ds.l 1
.dc.l _b_keyinp
*B_KEYSNS
.dc.w $0400+_B_KEYSNS*4
old_b_keysns::
.ds.l 1
.dc.l _b_keysns
*KEY_INIT
.dc.w $0400+_KEY_INIT*4
.ds.l 1
.dc.l _key_init
*SKEYSET
.dc.w $0400+_SKEYSET*4
.ds.l 1
.dc.l _skeyset
*LEDCTRL
.dc.w $0400+_LEDCTRL*4
.ds.l 1
.dc.l _ledctrl
*LEDSET
.dc.w $0400+_LEDSET*4
.ds.l 1
.dc.l _ledset
*KEYDLY
.dc.w $0400+_KEYDLY*4
.ds.l 1
.dc.l _keydly
*KEYREP
.dc.w $0400+_KEYREP*4
.ds.l 1
.dc.l _keyrep
*LEDMOD
.dc.w $0400+_LEDMOD*4
.ds.l 1
.dc.l _ledmod
*JOYGET
.dc.w $0400+_JOYGET*4
old_joyget::
.ds.l 1
.dc.l _joyget
*ベクタ管理テーブル終わり
.dc.w 0
********************************
*走行中のプログラムのメモリ管理ポインタへのハンドル
prog_hdl::
.dc.l 0
********************************
*現在アクティブなタスクのファイル名へのポインタ
active_task::
.dc.l 0
********************************
*Interrupt発生時のためのsspのワーク
interrupt_ssp::
.dc.l 0
********************************
*コード変換テーブルの先頭アドレス
prefix_table::
.dc.l default_prefix_table *&prefix
assign_table::
.dc.l default_assign_table *&assign
suffix_table::
.dc.l default_suffix_table *&suffix
char_table::
.dc.l default_char_table *文字コード
meta_table::
.dc.l default_meta_table *メタキー
prog_table::
.dc.l default_prog_table *プログラム
********************************
*イベントを発生するキーのテーブルのアドレス
break_table::
.dc.l default_break_table *BREAK
copy_table::
.dc.l default_copy_table *コピー
den_table::
.dc.l default_den_table *電卓
int_table::
.dc.l default_int_table *Interrupt
reset_table::
.dc.l default_reset_table *リセット
sbreak_table::
.dc.l default_sbreak_table *SHIFT+BREAK
lock_table::
.dc.l default_lock_table *禁止
unlock_table::
.dc.l default_unlock_table *解除
********************************
*イベントを発生するキーに対するプロシージャ
break_proc::
.dc.l default_break_proc
copy_proc::
.dc.l default_copy_proc
den_proc::
.dc.l default_den_proc
int_proc::
.dc.l default_int_proc
reset_proc::
.dc.l default_reset_proc
sbreak_proc::
.dc.l default_sbreak_proc
********************************
*_SKEYSETプロシージャ
skeyset_proc::
.dc.l skeyset_main
********************************
*拡張バッファ関係のワーク
extend_size::
.dc.w 0 *拡張バッファのサイズ(ワード数)
extend_head::
.dc.l 0 *拡張バッファの先頭
extend_tail::
.dc.l 0 *拡張バッファの末尾
extend_used::
.dc.w 0 *データ数(ワード数)
extend_read::
.dc.l 0 *先頭のデータの位置
extend_last::
.dc.l 0 *最後のデータの位置
********************************
*キーの押し下げ状態マトリクスとキューのワーク
* このマトリクスは誤入力の判定に使うので、遅延の影響を受けません。
matrix_bits::
.dcb.b 16,0 *キーの押し下げ状態マトリクス
queue_head::
.dc.w 0 *キューの先頭位置
queue_count::
.dc.w 0 *キューのデータ数
queue_top::
.dcb.b Q_SIZE,0 *キュー領域
********************************
*ルールの判定に使うBITSNSマップ($0800~$080Fに対応)
inner_map::
.dcb.b 16,0
********************************
*キー入力禁止状態で使うBITSNSマップ($0800~$0811に対応)
lock_map::
.dcb.b 18,0 *BITSNSマップ
********************************
*リピート関係の設定($0800~$080Fに対応)
repeat_bits::
.dcb.b 16,0 *リピート入力しないキー
live_repeat_bits::
.dcb.b 14,0 *リピート入力しないキーの初期値
.dc.b %00001111
.dcb.b 1,0
kill_repeat_bits::
.dcb.b 14,0 *離したとき他のリピート入力を止めるキー
.dc.b %00001111
.dcb.b 1,0
********************************
*ASK68Kの変更のためのワーク
* &askのデフォルトはauto(5),ins(7),led(6),lock(1),tsu(2)
ask_flag_bits::
* BA98_76543210
.dc.l %0000_11100110 *変更する項目のビット=1
ask_mode_area::
.dc.l 0 *ASK68KのSHIFTなどのフラグのアドレス
********************************
*オプションで指定するフラグ
ask_flag::
.dc.b 0 *ASK68Kを変更する=-1
extend_flag::
.dc.b 0 *キーバッファを拡張する=-1
click_flag::
.dc.b 0 *クリック音を鳴らす=-1
delay_flag::
.dc.b 0 *誤入力を回避する=-1
full_flag::
.dc.b 0 *バッファフルを知らせる=-1
lock_flag::
.dc.b 0 *キー入力禁止モードを使用する=-1
joykey_flag::
.dc.b 0 *キーでジョイスティックの操作をする=-1
led_flag::
.dc.b 0 *LEDを入れ替える=-1
meta_flag::
.dc.b 0 *メタキーを使う=-1
repeat_flag::
.dc.b 0 *押されたキーのリピートを抑制する=-1
prog_flag::
.dc.b 0 *プログラム毎に異なるキー配置を使う=-1
stop_flag::
.dc.b 0 *離されたとき他のリピートを止める=-1
tvkey_flag::
.dc.b 0 *テレビコントロールのキー入力を有効にする=-1
exchange_flag::
.dc.b 0 *スキャンコードを変換する=-1
********************************
*その他のフラグ類
device_flag::
.dc.b 0 *デバイスドライバとして組み込まれた=-1
compact_flag::
.dc.b 0 *Compactのキーボードを使用している=-1
num_led::
.dc.b 0 *NUMキーのLEDが点灯している=-1
lock_mode::
.dc.b 0 *キー入力が禁止されている=-1
int_mode::
.dc.b 0 *&intの利用を禁止する=-1
********************************
*LEDの入れ替えマップ(対応するビット=0)
led_map::
.dc.b %11111110
.dc.b %11111101
.dc.b %11111011
.dc.b %11110111
.dc.b %11101111
.dc.b %11011111
.dc.b %10111111
********************************
*ジョイスティックのキーの割り当てマップ
* ビット昇順でスキャンコードを記述。対応なし=0。
* デフォルトはテンキーの8/2/4/6とZ/X。
joy1_map::
.dc.b $44,$4C,$47,$49,$00,$2A,$2B,$00
joy2_map::
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.even
********************************
*キー入力エラー割り込みルーチン
key_err::
tst.b UDR *キー入力データを捨てる
rte
********************************
*常駐チェックに使う文字列
program_id::
.dc.l PROMARK *プログラム
.dc.l VERMARK *バージョン
********************************
*キー入力割り込み処理ルーチン
key_int::
*レジスタ待避
movem.l d0-d7/a0-a4/a6,-(sp)
*キーデータを取り込む
move.b UDR,d1 *キー入力データ
*相対アドレッシングのためのベースレジスタの設定
lea.l base(pc),a6
*キーボードの初期化ならば分岐
cmp.b #$FE,d1
bcc initkey *キーボードの初期化
*Interrupt発生時のためのsspを設定
lea.l 4*14(sp),a0 *プッシュしたレジスタの個数に注意
move.l a0,(interrupt_ssp)r
*キー入力割り込みを禁止する
bclr.b #4,IMRA *キー入力割り込みマスククリア
*割り込みレベルを設定
move.w (a0),d0 *割り込み前のsr
and.w #$0700,d0 *割り込み前の割り込みレベル
move.w sr,d2
and.w #$F8FF,d2 *割り込みレベルだけ消す
or.w d2,d0 *割り込みレベルだけ変更する
move.w d0,sr
*simulateメインを呼び出す
bsr simulate_main *simulateメイン
*キー入力割り込みマスクを復元する
bset.b #4,IMRA *キー入力割り込みマスクセット
key_int_end::
*レジスタ復元
movem.l (sp)+,d0-d7/a0-a4/a6
rte
*キーボードの初期化
initkey::
beq compact *Compactの場合
*キーボード関係を初期化する
move.b LEDSNS.w,d1 *LEDの状態
bsr _key_init *キーボード関係の初期化
*初期化終了
bra key_int_end
*Compactの場合
compact::
st.b (compact_flag)r *フラグをセット
*NUMキーのLEDを初期化する
* clr.b (num_led)r
bsr _numset *現在のモードに従ってNUMキーのLEDを設定
*初期化終了
bra key_int_end